package cfca.paperless.client.servlet._1_basic._1_01_SynthesizeBizDataToPDFTemplate;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import cfca.paperless.client.bean.FieldBean;
import cfca.paperless.client.bean.ImageBean;
import cfca.paperless.client.bean.QRCodeBean;
import cfca.paperless.client.bean.TextBean;
import cfca.paperless.client.servlet.PaperlessClient;
import cfca.paperless.client.servlet.PaperlessConfig;
import cfca.paperless.client.util.Base64;
import cfca.paperless.client.util.GUID;
import cfca.paperless.client.util.IoUtil;
import cfca.paperless.client.util.PaperlessUtil;

/**
 * @Description PDF自动化合成模板业务数据接口，使用示例。
 * 1，操作对象为单个PDF模板文件。
 * 2，合成内容包含：文本域内容、文本、图片和二维码。
 * 3，返回成功合成内容的PDF文件。
 * 
 * @Author dell
 * @Date 2017-12-12
 * @CodeReviewer TODO
 */
public class SynthesizeAutoTemplateTest01 {

    public static void main(String[] args) throws Exception {

        long timeStart = System.currentTimeMillis();// 开始时间

        System.out.println("SynthesizeAutoTemplateTest01 START");
        
        PaperlessClient clientBean = new PaperlessClient(PaperlessConfig.url, 10000, 60000);

        // 模板编码，需要在无纸化管理系统中添加此模板的信息，登录管理页面->选择业务管理->选择业务模板 ->添加模板文件，
        // 需要在业务模板审核中进行审核并通过后才能使用。 
        // 示例中使用的PDF模板文件：\TestData\tmp.pdf。
        String templateCode = "T001";// TODO

        // 保存到临时PDF表中的pdfId，符合唯一约束（可以为空）
        // 不为空时，则在服务端的临时PDF表[TEMP_FILE_PDF]中，指定表中字段PDF_ID为此值，保存PDF文件数据，只保留1个小时，超时则清除。
        // 为空时，则不会在服务端保存PDF文件数据。
        String savedPdfId = GUID.generateId();
        //String savedPdfId = "";
        System.out.println("临时PDF表保存的pdfId=" + savedPdfId);

        // 需要合成到PDF文本域的业务数据，可为空
        List<FieldBean> fieldBeanList = getFieldBeanList();
        String fieldBeanListXml = PaperlessUtil.buildFieldBeanListXml(fieldBeanList);// true代表合成文本域时部分flatten,默认为false：全部flatten
        
        // 需要合成到PDF中的文本，可为空
        List<TextBean> textBeanList = getTextBeanList();
        String textBeanListXml = PaperlessUtil.buildTextBeanListXml(textBeanList);

        // 需要合成到PDF中的图片和二维码，可为空
        List<ImageBean> imageBeanList = getImageBeanList();
        List<QRCodeBean> qrCodeBeanList = getQRCodeBeanList();// 可为空
        String imageBeanListXml = PaperlessUtil.buildImageBeanListXml(imageBeanList, qrCodeBeanList);
        
        System.out.println(fieldBeanListXml);
        System.out.println(textBeanListXml);
        System.out.println(imageBeanListXml);

        String systemNo =GUID.generateId();//业务流水号
        
        byte[] synthesizeResult = clientBean.synthesizeAutoTemplate(systemNo, templateCode, savedPdfId, fieldBeanListXml, textBeanListXml, imageBeanListXml,
                PaperlessConfig.operatorCode, PaperlessConfig.channelCode);
        
        String existErrorTag = PaperlessUtil.isError(synthesizeResult);
        if ("".equals(existErrorTag)) {
            System.out.println("SynthesizeAutoTemplateTest01 END OK");
            IoUtil.write("./TestData/output/SynthesizeAutoTemplateTest01.pdf", synthesizeResult);
        } else {
            System.out.println("SynthesizeAutoTemplateTest01 END NG");
            System.out.println(new String(synthesizeResult, "UTF-8"));
        }
        
        
        long timeEnd = System.currentTimeMillis();// 结束时间
        System.out.println("##########" + "time used:" + (timeEnd - timeStart) + "##########");

    }

    private static List<FieldBean> getFieldBeanList() throws Exception {
        List<FieldBean> fieldBeanList = new ArrayList<FieldBean>();

        fieldBeanList.add(new FieldBean("serialNo", "201712121739408898538024", "", "text"));
        fieldBeanList.add(new FieldBean("sequenceNo1", "20171212174008004", "", "text"));
        
        fieldBeanList.add(new FieldBean("cardNo1", "6226 1234 5678 5698", "", "text"));
        fieldBeanList.add(new FieldBean("accountName", "张三", "", "text"));
        fieldBeanList.add(new FieldBean("ICcardType", "借记卡", "", "text"));
        fieldBeanList.add(new FieldBean("identType", "身份证", "", "text"));
        fieldBeanList.add(new FieldBean("identNo", "110112201712125678", "", "text"));
        
        fieldBeanList.add(new FieldBean("branch", "北京分行亦庄支行", "", "text"));
        fieldBeanList.add(new FieldBean("operator", "李四", "", "text"));
        fieldBeanList.add(new FieldBean("date", "2017年12月12日", "", "text"));

        return fieldBeanList;
    }

    private static List<TextBean> getTextBeanList() throws Exception {
        List<TextBean> textBeanList = new ArrayList<TextBean>();
        
        TextBean textBean1 = new TextBean("你好啊，\r\n我是根据坐标进行合成的！", "", 1, 100, 100);// 指定文本，根据坐标定位进行合成
        textBean1.setTextFontSize("15");
        textBean1.setTextColor("FF0000");
        textBean1.setSpacingHeight(20);// 设置行间距，默认15像素
        
        textBeanList.add(textBean1);
        
        TextBean textBean2 = new TextBean("你好啊，\r\n我是根据关键字进行合成的！", "", "资料", "R", 10, 10);// 指定文本，根据关键字定位进行合成
        textBean2.setTextFontSize("15");
        textBean2.setTextColor("0000FF");
        textBean1.setSpacingHeight(20);// 设置行间距，默认15像素
        
        textBeanList.add(textBean2);

        return textBeanList;
    }

    private static List<ImageBean> getImageBeanList() throws Exception {
        List<ImageBean> imageBeanList = new ArrayList<ImageBean>();
        
        byte[] imageData = FileUtils.readFileToByteArray(new File("./TestData/zhangfei.png"));
        String imagePath = Base64.toBase64String("./paperlessServerConfig/seal/starmodel.png".getBytes("UTF-8"));// 服务器端存储的图片文件路径
        // 印模编码，需要在无纸化管理系统中添加此印模的信息，登录管理页面->选择电子印章管理->选择印模管理->添加印模信息，需要在印模审核中进行审核并通过后才能使用。 
        String imageCode = "ym2018042749584404";// TODO 服务器端制作的印模编码
        
        ImageBean imageBean1 = new ImageBean("100", "100", 1, "120", "120");// 传入图片数据，根据坐标定位进行合成
        imageBean1.setImageData(imageData);
        
        imageBeanList.add(imageBean1);
        
        ImageBean imageBean2 = new ImageBean("100", "100", "申请人/代理人签名", "D", 0, 0);// 传入图片数据，根据关键字定位进行合成
        imageBean2.setImageData(imageData);
        
        imageBeanList.add(imageBean2);

        ImageBean imageBean3 = new ImageBean("100", "100", "银行签章", "R", 10, 0);// 传入路径，根据坐标定位进行合成
        imageBean3.setImagePath(imagePath);
        
        imageBeanList.add(imageBean3);

        ImageBean imageBean4 = new ImageBean("100", "100", 1, "400", "200");// 传入印模编码，根据坐标定位进行合成
        imageBean4.setSealImageCode(imageCode);
        
        imageBeanList.add(imageBean4);
        
        return imageBeanList;
    }

    private static List<QRCodeBean> getQRCodeBeanList() throws Exception {
        List<QRCodeBean> qrCodeBeanList = new ArrayList<QRCodeBean>();
        
        QRCodeBean qrCodeBean = new QRCodeBean("二维码内容", "100", "100", 1, "350", "50");// 二维码内容，二维码宽度、高度，根据坐标定位进行合成，左下角开始的横坐标、纵坐标
        qrCodeBeanList.add(qrCodeBean);
        
        return qrCodeBeanList;
    }
}
